<?php
// +----------------------------------------------------------------------
// | Author:July
// +----------------------------------------------------------------------
// | 创建时间: 2023-12-18 21:04:09
// +----------------------------------------------------------------------
// | Cms标签
// +----------------------------------------------------------------------

namespace july\julyadmin\taglib;

use think\facade\Db;
use think\template\TagLib;

class Cms extends TagLib
{

    /**
     * 定义标签列表
     * 标签定义： attr 属性列表 close 是否闭合(0 或者1 默认1) alias 标签别名 level 嵌套层次
     */
    protected $tags = [
        //php标签，可以执行一段php代码
        "php" => ["attr" => "", "close" => 1],
        //db查询，相当于调用think\facade\Db查询数据
        "db"  => ["attr" => "name,field,where,cache,order,group,limit", "close" => 1],
    ];

    /**
     * php标签，可以执行一段php代码
     * @Author   July
     * @DateTime 2023-12-20T19:47:00+0800
     * @param    array                   $attr    模板标签上面传递的参数信息，是一个数组
     * @param    string                  $content 模板标签中包起来的内容
     * @return   [type]                           处理结果字符串
     * 模板中调用方式
     * {cms:php}
     *   php代码
     * {/cms:php}
     */
    public function tagPhp($attr, $content)
    {
        $result = <<<EOT
<?php
    {$content}
?>
EOT;
        return $result;
    }

    /**
     * php标签，可以执行一段php代码
     * @Author   July
     * @DateTime 2023-12-20T19:47:00+0800
     * @param    array                   $attr    模板标签上面传递的参数信息，是一个数组
     * $attr = [
     *     'name'=>'',//表名[必填]
     *     'field'=>'',//允许显示的字段[非必填，默认为*]
     *     'where'=>'',//查询条件[非必填]
     *     'cache'=>'缓存key[必填],缓存秒数[不填或为0则为永久缓存]',//缓存[非必填]
     *     'order'=>'',//排序，字符串，如"id ASC",
     *     'group'=>'',//分组，字符串，如"name"
     *     'limit'=>'开始位置,查询多少条',//分页[可不填，不填则默认为1条]
     * ];
     * @param    string                  $content 模板标签中包起来的内容
     * @return   String                           处理结果字符串
     * 模板中调用方式
     * {cms:db name="content" key="v"}
     *   引用查询结果的代码，如
     *   {$v}
     * {/cms:db}
     */
    public function tagDb($attr, $content)
    {
        try {
            $info = [
                'name|表名'           => 'require',
                'key|接收查询结果的变量名key' => 'require',
            ];
            validate($info)->check($attr);
        } catch (\think\exception\ValidateException $e) {
            throw new \Exception($e->getError());
        }
        $name  = $attr['name'];
        $key   = $attr['key'];
        $field = isset($attr['where']) && $attr['where'] !== '' ? $attr['where'] : '*';
        $where = isset($attr['where']) && $attr['where'] !== '' ? $attr['where'] : '';
        $cache = isset($attr['cache']) && $attr['cache'] !== '' ? $attr['cache'] : '';
        $order = isset($attr['order']) && $attr['order'] !== '' ? $attr['order'] : '';
        $group = isset($attr['group']) && $attr['group'] !== '' ? $attr['group'] : '';
        $limit = isset($attr['limit']) && $attr['limit'] !== '' ? $attr['limit'] : '0,1';

        $result = <<<EOT
        <?php
            \$name = '{$name}';
            \$key = '{$key}';
            \$field = '{$field}';
            \$where ='{$where}';
            \$cache = '{$cache}';
            \$order = '{$order}';
            \$group = '{$group}';
            \$limit = '{$limit}';
            \$db = \\think\\facade\\Db::name(\$name);
            if (\$where) {
                \$db->where(\$where);
            }

            if (\$cache) {
                \$cache = explode(',', \$cache);
                \$db->cache(\$cache[0], isset(\$cache[1]) && \$cache[1] ? \$cache[1] : 0);
            }

            if (\$order) {
                \$db->order(\$order);
            }

            if (\$group) {
                \$db->order(\$group);
            }

            if (\$limit) {
                if (!is_string(\$limit)) {
                    throw new \\Exception('limit参数只能是字符串');
                }
                \$limit = explode(',', \$limit);
                \$db->limit(isset(\$limit[1]) && \$limit[1] ? \$limit[1] : 0, isset(\$limit[1]) && \$limit[1] ? \$limit[1] : 1);
            }
            \$dbRes = \$db->select()->toArray();
        ?>
        {volist name="\$dbRes" id="{$key}"}
            {$content}
        {/volist}

EOT;
        return $result;
    }
}
